import pandas as pd
import re
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager
import seaborn as sns
from sklearn.metrics import accuracy_score, confusion_matrix, precision_score, recall_score, f1_score

# 设置中文字体
font_path = 'C:\\Windows\\Fonts\\simhei.ttf'  # 请根据实际路径调整
font_prop = font_manager.FontProperties(fname=font_path)
plt.rcParams['font.family'] = font_prop.get_name()

# 读取Excel文件
file_path = 'D:\\实验\\生产实习\\output_data1+2+3.xlsx'  # 请将此路径替换为实际文件路径
df = pd.read_excel(file_path)

# 定义游戏类和广告类关键词及其权重
keywords = {
    '游戏': 1.0, '道具': 1.8, '装备': 2.0, '升级': 2.5, '任务': 1.8, '角色': 1.7, '竞技场': 1.9, '礼包': 1.5, 
    '金币': 1.5, '钻石': 1.7, '技能': 2.5, '召唤': 2.0, '武器': 1.7, '挑战': 1.9, '成就': 1.8, '副本': 2.0, 
    '战斗': 2.0, '经验值': 2.0, '公会': 1.5, '英雄': 1.8, '天赋': 1.7, '皮肤': 4.5, '对战': 2.0, '魔法': 3.0, 
    '怪物': 2.0, '装备升级': 2.5, '任务奖励': 1.7, '每日签到': 1.5, '等级提升': 2.0, '宝箱': 1.5, '神装': 1.8, 
    '神器': 2.0, '强化': 2.0, '成长值': 1.6, '经验药水': 1.7, '副本挑战': 2.0, '竞技排名': 1.8, '秘境探险': 1.8, 
    '宝石': 1.7, '水晶': 1.5, '勇士': 1.8, '坐骑': 1.7, '灵魂': 1.5, '排行榜': 1.7, '精灵': 1.8, '成长': 1.5, 
    '获得': 1.0, '召唤师': 1.6, '头像': 2.3, '语音': 1.2, '界面': 1.2, '战令': 1.6, '荣耀': 3.8, '配件': 1.5, 
    '弹药': 1.4, '载具': 1.4, '背包': 3.3, '外观': 1.2, '通行证': 1.5, '徽章': 1.4, '特权': 1.5, '特殊': 1.2, 
    '图标': 1.2, '动作': 1.3, '背景': 1.2, '音效': 1.3, '旗帜': 1.2, '魂': 2.6, '阵眼': 1.7, '玉': 2.5, '材料': 1.2, 
    '御灵': 1.7, '觉醒': 2.0, '福袋': 1.3, '羁绊': 1.6, '蛋仔': 4.2, '帽子': 1.3, '交互': 1.2, '礼物盒': 1.2, 
    '表情': 1.3, '音乐': 1.2, '主题曲': 1.5, '纪念章': 1.3, '稀有': 1.7, '金蛋': 1.3, '派对': 1.5, '绝版': 1.8, 
    '特效': 2.0, '活跃度': 1.5, '伙伴': 1.8, '元气': 1.3, '风格': 1.2, '卷轴': 1.3, '觉醒石': 1.8, '品质': 1.5, 
    '命运': 1.7, '款式': 1.2, '赠礼': 1.3, '勋章': 2.9, '原石': 1.6, '英灵': 1.8, '紫水晶': 1.5, '精致道具': 1.7, 
    '外貌': 1.2, '传送': 1.3, '场景': 1.2, '七星': 1.8, '手办': 1.2, '金属干支': 1.5, '神魔斗技': 1.7, '彩绘道具': 1.6, 
    '极星图书馆': 1.5, '三星寻宝': 1.6, '称号': 1.5, '戒指': 1.2, '币': 4.0, '新手': 1.7, '阵容': 1.8, '装备强化': 2.0, 
    '大陆': 1.8, '职业': 1.7, '攻略': 1.7, '技能点': 1.8, '皮肤碎片': 1.8, '神器碎片': 2.0, '活动': 1.8, '每日任务': 1.7, 
    '宠物': 1.5, '打怪': 1.8, '副本奖励': 1.7, '炼金': 1.5, '锻造': 1.7, '拍卖行': 1.8, '进阶': 1.8, '技能升级': 2.0, 
    '任务链': 1.7, '关卡': 1.8, '团队副本': 2.0, '修炼': 1.5, '传说': 1.7, '历练': 1.5, '声望': 1.7, '声望奖励': 1.8, 
    '副本攻略': 2.0, '神器养成': 1.8, '经验副本': 1.7, '镜域双华': 5.0, '赞萌露比': 5.0, '点券': 4.0, '木乃伊': 3.0, 
    '元梦': 2.5, '杜卡迪': 4.5, '盲盒': 2.0, '小橘子': 5.0, '菜狗': 3.7, '非凡': 1.7, '超人': 1.8, '验证码': 1.3, 
    '快手': 3.0, '战术': 2.5, '专属': 1.5, '时装': 2.5, '物品': 2.0, '死亡': 2.5, '金皮': 2.5, '跑酷': 2.0, '传奇': 2.5, 
    '女巫': 2.5, '双倍': 2.0, '守护者': 2.5, '小队': 2.0, '娱乐': 1.5, '魂师': 2.5, '进化': 3.0, '突破': 2.0, '之星': 2.5, 
    '驯龙': 2.0, '风驰电掣': 2.0, '大师': 2.5, '滑板': 3.0, '地铁': 2.5, '元月': 2.0, '泳池': 2.0, '欧米茄': 3.0
}

# 预处理文本数据
df['text'] = df['text_list'].apply(lambda x: ' '.join(eval(x)))

# 定义判断函数
def is_game_text(text, keywords, threshold=9.6):
    # 去除文本中的符号和标点
    text = re.sub(r'[^\w\s]', '', text)
    # 统计匹配的词汇得分
    score = sum(weight for word, weight in keywords.items() if word in text)
    # 返回是否为游戏类文本的判断结果
    return score >= threshold

# 应用到数据集
df['is_game'] = df['text'].apply(lambda x: is_game_text(x, keywords))

# 构建更多规则
def additional_rules(text):
    # 规则1：出现特定的组合词
    if '竞技场' in text and '挑战' in text:
        return True
    # 规则2：出现多次关键字
    keywords_count = sum(text.count(word) for word in keywords.keys())
    if keywords_count > 5:
        return True
    # 规则3：出现高级关键字
    high_value_keywords = ['神装', '神器', '强化', '副本挑战']
    if any(word in text for word in high_value_keywords):
        return True
    return False

# 应用更多规则
df['is_game_additional'] = df['text'].apply(additional_rules)

# 最终判断结果
df['is_game_final'] = df['is_game'] | df['is_game_additional']

# 将 true_label 和 is_game 列进行 not xor 运算，得到 Accuracy 列
df['Accuracy'] = ~(df['true_label'] ^ df['is_game_final'])

# 计算各项性能指标
true_labels = df['true_label']
predicted_labels = df['is_game_final']

accuracy = accuracy_score(true_labels, predicted_labels)
conf_matrix = confusion_matrix(true_labels, predicted_labels)
precision = precision_score(true_labels, predicted_labels)
recall = recall_score(true_labels, predicted_labels)
f1 = f1_score(true_labels, predicted_labels)

# 输出性能指标
print(f"Accuracy: {accuracy}")
print(f"Confusion Matrix:\n{conf_matrix}")
print(f"Precision: {precision}")
print(f"Recall: {recall}")
print(f"F1 Score: {f1}")

# 绘制混淆矩阵图表
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=['合规', '违禁'], yticklabels=['合规', '违禁'])
plt.xlabel('预测标签')
plt.ylabel('实际标签')
plt.title('混淆矩阵')
plt.show()

# 保存结果到新文件
output_path = 'D:\\实验\\生产实习\\output_data1+2+3_with_game_classification_combined_rules.xlsx'
df.to_excel(output_path, index=False)

print(f"分类结果已保存到 {output_path}")
